package model;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.LinkedList;

import javax.swing.JOptionPane;
import javax.swing.RowFilter;


public class EseguiDLVK {
	
	public static String EXE ="DLVConfig/dlv.mingw.exe DLVConfig/ciccioTest2.plan DLVConfig/ciccioTest3.dl -FP -N=8";
	public static int planLenght;
	
	//prima di richiamare questa classe vanno settati i parametri giusti nel file monkey.plan!!!

	public static LinkedList<String> runDlv()
	{
		
		String line=null,plane=null;
		String [] actionTemp;
		LinkedList<String> action=new LinkedList<String>();

		try{
			Process pr = Runtime.getRuntime().exec(EXE);
			InputStream in = (InputStream) pr.getInputStream();
			InputStreamReader ist = new InputStreamReader(in);
			BufferedReader br = new BufferedReader(ist);

		
			while((line = br.readLine()) != null)
			{
				if(line.startsWith("PLAN: "))
				{
					plane = line.substring(6);
					break;
				}
				//Se ce stato qualche problema nell' esecuzione del piano esco
//				else if(line.startsWith("Warning: ") || line.startsWith(""))
//				{
//					JOptionPane.showMessageDialog(null,"Lunghezza del piano("+planLenght+") insufficinete");
//					return null;
//				}
			}

			br.close();

		}catch(Exception e){
			e.printStackTrace();
		}
		
		actionTemp = plane.split(";");
		
		//Ripulisco il piano dai no action prima di restituirlo
		for(int i=0;i<actionTemp.length;i++){
			if(actionTemp[i].contains("move("))
				action.add(actionTemp[i]);
		}
		
		
		return action;
	}

//	/**
//	 * Scrivo le impostazioni del piano in maniera automatica
//	 * Lunghezza del piano che dovrebbe essere incrementale
//	 * @param env
//	 * @throws IOException
//	 */
//	public static void writeSettingPlan(Environment env,String nomeFile,int lenght) throws IOException{
//
//		planLenght=lenght;
//		String s;
//		
//		boolean blockGoalTrovato=false;boolean blockInitiallyTrovato=false;
//		FileReader reader=new FileReader(new File("DLVConfig/"+nomeFile));
//		BufferedReader buffReader=new BufferedReader(reader);
//		
//		PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("DLVConfig/"+nomeFile,true)));
//		s=buffReader.readLine();
//		
//		
//		/**
//		 * Leggo il file .plan che devo rigenerare in parte
//		 */
//		while(s!=null){
//			
//			if(s.contains("initially:"))
//				blockInitiallyTrovato=true;
//			
//			if(s.contains("goal:"))
//				blockGoalTrovato=true;
//			
//		
//			s=buffReader.readLine();
//				
//		}
//		
//		if(!blockInitiallyTrovato){
//
//			out.println("initially:");
//			for(int i=0;i<env.flat.length;i++)
//				for(int j=0;j<env.flat.width;j++){
//					switch(env.flat.get(i, j)){
//
//					case MEAL:
//						out.println("is_at(meal,"+i+","+j+").");
//						break;
//					case SMOKING:
//						out.println("is_at(smoking,"+i+","+j+").");
//						break;
//					case TABLE:
//						out.println("is_at(table,"+i+","+j+").");
//						break;
//					case FLOWERS:
//						out.println("is_at(flower,"+i+","+j+").");
//						break;
//					}
//
//					//Assegno la posizione a ciccio
//					if(i==env.agent.x && j==env.agent.y)
//						out.println("is_at(ciccio,"+i+","+j+").");
//				}
//		}
//		if(!blockGoalTrovato){
//					//Assegno uno spazio tra i blocchi initially e goal	
//			out.println("goal: cenaPortata ? ("+planLenght+")" );
//		}
//		out.close();
//		
//		
//	}
//
//	/**
//	 * All' avvio del programma leggo il piano precedente ed elimino le parti che devono essere
//	 * Sovrascritte
//	 * @throws IOException 
//	 */
//	public static void readAndModifyPlan(String nomeFile) throws IOException{
//		
//		File file=new File("DLVConfig/"+nomeFile);
//		FileReader reader=new FileReader(file);
//		BufferedReader read=new BufferedReader(reader);
//		LinkedList<String> rowsFile=new LinkedList<String>();
//		
//		String line=null;
//		while( (line = read.readLine()) !=null ){
//			if(!line.equals("\t") && !line.equals("") )
//			rowsFile.add(line);
//		}
//		//Elimino blocco goal
//		{
//			rowsFile.remove(rowsFile.getLast());    //Ciccio
//		
//		}
////		
//		//Elimino blocco initially dalla ultimo al primo
//		{
//			rowsFile.remove(rowsFile.getLast());    //Ciccio
//			rowsFile.remove(rowsFile.getLast());    //Flower
//			rowsFile.remove(rowsFile.getLast());    //Table
//			rowsFile.remove(rowsFile.getLast());    //Smoking
//			rowsFile.remove(rowsFile.getLast());    //Meal
//			rowsFile.remove(rowsFile.getLast());    //Initially
//		}
//		
//		read.close();
//		
//		//Adesso che ho eliminato la parte dinamica posso riscrivere il file
//		PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("DLVConfig/"+nomeFile)));
//		for(String riga:rowsFile)
//			out.println(riga);
//		
//				
//		out.flush();
//		out.close();
//		reader.close();
//		
//				
//	}
//
//	
//	/**
//	 * Con questa funzione riscrivo l' obbiettivo nel caso separassi il problema in sottobiettivi
//	 * e la lunghezza del piano
//	 * @param obiettivo
//	 * @param lunghezzaPiano
//	 * @throws IOException 
//	 */
//	public static void rewritingPlanLenght(String nomeFile,String obiettivo,int lunghezzaPiano) throws IOException{
//		File file=new File("DLVConfig/"+nomeFile);
//		FileReader reader=new FileReader(file);
//		BufferedReader read=new BufferedReader(reader);
//		LinkedList<String> rowsFile=new LinkedList<String>();
//		
//		String line=null;
//		while( (line = read.readLine()) !=null ){
//			if(!line.equals("\t") && !line.equals("") )
//			rowsFile.add(line);
//		}
//		//Elimino blocco goal precedente
//			rowsFile.remove(rowsFile.getLast());    //Ciccio
//		
//		//Reinserisco nuovo blocco goal
//			rowsFile.addLast("goal: "+obiettivo +" ? ("+planLenght+")");
//			
//			read.close();
//			
//			//Adesso che ho eliminato la parte dinamica posso riscrivere il file
//			PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("DLVConfig/"+nomeFile)));
//			for(String riga:rowsFile)
//				out.println(riga);
//			
//					
//			out.flush();
//			out.close();
//			reader.close();
//	}
}
